package uniquindio.facing.ingesis.moviles.undroiq.consumer;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import uniquindio.facing.ingesis.moviles.undroiq.activity.PestanasActivity;
import uniquindio.facing.ingesis.moviles.undroiq.activity.R;
import uniquindio.facing.ingesis.moviles.undroiq.entidades.Actividad;
import uniquindio.facing.ingesis.moviles.undroiq.entidades.Noticia;
import uniquindio.facing.ingesis.moviles.undroiq.entidades.Venta;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;

/**
 * Clase encargada de obtener la informacion y visualizarla en las listas
 * 
 * @author Manuel Felipe Echavarria Orozco.
 *
 */
public class Consumer {

	private static final int NOTIFICATION_ID = 1;

	//Recursos para las Noticias
	private Map<String, Noticia> recoveryNews;
	private List<Noticia> noticias;
	private String[] titulosNoticias;
	private String[] descripcionesNoticias;

	//Recursos para las Activiades
	private Map<String, Actividad> recoveryActivities;
	private List<Actividad> actividades;
	private String[] titulosActividades;
	private String[] descripcionesActividades;
	private String[] horas;
	private String[] lugares;

	//Recursos para las Ventas
	private Map<String, Venta> recoverySales;
	private List<Venta> ventas;
	private String[] titulosVentas;
	private String[] descripcionesVentas;
	private String[] precios;
	private String[] telefonos;
	private String[] correos;

	private Context context;

	public Consumer(Context context) {
		this.context = context;
	}

	/**
	 * Metodo encargado de obtener y lista la informacion
	 * 
	 * @param icono
	 */
	public void consume(int icono) {

		consumeNews();
		consumeActivities();
		consumeSales();

		populateArraysNoticias();
		populateArraysActiviades();
		populateArraysVentas();

		createNotification(context,icono);
	}

	/**
	 * Metodo encargado de crear la noticicacion y listar la informacion.
	 * 
	 * @param context
	 * @param icono
	 */
	private void createNotification(Context context, int icono) {
		NotificationManager mNotificationManager = (NotificationManager)
				context.getSystemService(Context.NOTIFICATION_SERVICE);
		int icon=0;
		if (icono==2) 
			icon = R.drawable.ic_action_search;
		if (icono==3) 
			icon = R.drawable.ic_cancelar;



		CharSequence tickerText = "Tus datos han sido cargadas";
		long when = System.currentTimeMillis();

		Notification notification = new Notification(icon, tickerText, when);

		CharSequence contentTitle = "Tus datos han sido cargados";
		CharSequence contentText = "Revisalos aqui";

		Intent notificationIntent = new Intent(context, PestanasActivity.class);

		//Noticias
		notificationIntent.putExtra("titulosNoticias", titulosNoticias);
		notificationIntent.putExtra("descripcionesNoticias", descripcionesNoticias);

		//Actividades
		notificationIntent.putExtra("titulosActiviades", titulosActividades);
		notificationIntent.putExtra("descripcionesActiviades", descripcionesActividades);
		notificationIntent.putExtra("horasActiviades", horas);
		notificationIntent.putExtra("lugaresActiviades", lugares);

		//Ventas
		notificationIntent.putExtra("titulosVentas", titulosVentas);
		notificationIntent.putExtra("descripcionesVentas", descripcionesVentas);
		notificationIntent.putExtra("precios", precios);
		notificationIntent.putExtra("telefonos", telefonos);
		notificationIntent.putExtra("correos", correos);

		PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
		notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
		mNotificationManager.notify(NOTIFICATION_ID, notification);
	}

	/**
	 * Metodo encargado de listar la informacion de los objetos Noticia
	 */
	private void populateArraysNoticias() {
		titulosNoticias = new String[recoveryNews.size()];
		descripcionesNoticias = new String[recoveryNews.size()];

		int i = 0;
		for (String id : recoveryNews.keySet()) {
			titulosNoticias[i] = recoveryNews.get(id).getTitulo();
			descripcionesNoticias[i] = recoveryNews.get(id).getDescripcion();
			i++;
		}
	}

	/**
	 * Metodo encargado de listar la informacion de los objetos Actividad
	 */
	private void populateArraysActiviades() {
		titulosActividades = new String[recoveryActivities.size()];
		descripcionesActividades = new String[recoveryActivities.size()];
		horas = new String[recoveryActivities.size()];
		lugares = new String[recoveryActivities.size()];

		int i = 0;
		for (String id : recoveryActivities.keySet()) {
			titulosActividades[i] = recoveryActivities.get(id).getTitulo();
			descripcionesActividades[i] = recoveryActivities.get(id).getDescripcion();
			horas[i] = recoveryActivities.get(id).getHora();
			lugares[i] = recoveryActivities.get(id).getLugar();
			i++;
		}
	}

	/**
	 * Metodo encargado de listar la informacion de los objetos Venta
	 */
	private void populateArraysVentas() {
		titulosVentas = new String[recoverySales.size()];
		descripcionesVentas = new String[recoverySales.size()];
		precios = new String[recoverySales.size()];
		telefonos = new String[recoverySales.size()];
		correos = new String[recoverySales.size()];

		int i = 0;
		for (String id : recoverySales.keySet()) {
			titulosVentas[i] = recoverySales.get(id).getTitulo();
			descripcionesVentas[i] = recoverySales.get(id).getDescripcion();
			precios[i] = recoverySales.get(id).getPrecio();
			telefonos[i] = recoverySales.get(id).getTelefono();
			correos[i] = recoverySales.get(id).getCorreo();

			i++;
		}
	}

	/**
	 * Metodo encargado de capturar la informacion de los objetos Noticia
	 */
	private void consumeNews() {

		recoveryNews= new HashMap<String, Noticia>();

		cargarNoticias();

		for (Noticia noticia : noticias) {
			String idTweet = noticia.getTitulo();


			recoveryNews.put(idTweet, noticia);
		}

	}
	
	/**
	 * Metodo encargado de capturar la informacion de los objetos Actividad
	 */
	private void consumeActivities() {


		recoveryActivities= new HashMap<String, Actividad>();

		cargarActividades();

		for (Actividad actividad : actividades) {
			String idTweet = actividad.getId();

			recoveryActivities.put(idTweet, actividad);
		}

	}

	/**
	 * Metodo encargado de capturar la informacion de los objetos Venta
	 */
	private void consumeSales() {


		recoverySales= new HashMap<String, Venta>();

		cargarVentas();

		for (Venta venta : ventas) {
			String idTweet = venta.getId();

			recoverySales.put(idTweet, venta);
		}

	}

	/**
	 * Metodo encargado de cargar la informacion de los objetos Noticia
	 */
	private void cargarNoticias(){
		noticias= new ArrayList<Noticia>();
		Noticia noticia;
		for(int i=1; i<=25; i++){

			noticia = new Noticia("Not"+i,"Noticia"+i, "Descripcion"+i);

			noticias.add(noticia);
		}
	}

	/**
	 * Metodo encargado de cargar la informacion de los objetos Actividad
	 */
	private void cargarActividades(){
		actividades= new ArrayList<Actividad>();
		Actividad actividad;
		for(int i=1; i<=25; i++){

			actividad = new Actividad("Act"+i,"Titulo"+i,"Descripcion"+i,"Hora"+i,"Lugar"+i);

			actividades.add(actividad);
		}
	}

	/**
	 * Metodo encargado de cargar la informacion de los objetos Venta
	 */
	private void cargarVentas(){
		ventas= new ArrayList<Venta>();
		Venta venta;
		for(int i=1; i<=25; i++){

			venta = new Venta("Vent"+i,"Titulo"+i,"Descripcion"+i,"precio"+i,"telefono"+i,"correo"+i);

			ventas.add(venta);
		}
	}
}
